www.gusucode.com > VANET Toolbox- A Vehicular Network Simulator based on DES 程序工具箱matlab源码 > VANET Toolbox- A Vehicular Network Simulator based on DES/VANET_Toolbox/VANET_Toolbox_2018a/fcn_carGlobalDB.m
function out=fcn_carGlobalDB(varargin) persistent globalDatabase persistent sndcnt rcvcnt pktcolcnt delay accidentcnt crcerrcnt persistent lightSignal % nargin==0: RESET % nargin==1: Check GlobalDatabase % nargin==2: fetch the data % nargin==3: register info to GLOBALDATABASE % varargin{1}: vehicle ID % varargin{2}: positionX info % varargin{3}: positionY info switch varargin{1} case 'setLight' % 0-> green; 1-> yellow; 2->red; switch varargin{2} case 'weGREEN' lightSignal(1)=0; case 'weYELLOW' lightSignal(1)=1; case 'weRED' lightSignal(1)=2; case 'nsGREEN' lightSignal(2)=0; case 'nsYELLOW' lightSignal(2)=1; case 'nsRED' lightSignal(2)=2; end case 'getLight' out=lightSignal; case 'init' globalDatabase=containers.Map('KeyType','double', 'ValueType','any'); sndcnt=zeros(1,4); rcvcnt=zeros(1,4); pktcolcnt=zeros(1,4); crcerrcnt=zeros(1,4); accidentcnt=[]; lightSignal=[0 2]; % lightSignal(we,ns) % 0->green, 1->yellow,2->red case 'sent' switch varargin{2} case 0 sndcnt(1)=sndcnt(1)+1; case 1 sndcnt(2)=sndcnt(2)+1; case 2 sndcnt(3)=sndcnt(3)+1; case 3 sndcnt(4)=sndcnt(4)+1; end case 'latency' switch varargin{2} case 0 rcvcnt(1)=rcvcnt(1)+1; delay(rcvcnt(1),1)=varargin{3}; case 1 rcvcnt(2)=rcvcnt(2)+1; delay(rcvcnt(2),2)=varargin{3}; case 2 rcvcnt(3)=rcvcnt(3)+1; delay(rcvcnt(3),3)=varargin{3}; case 3 rcvcnt(4)=rcvcnt(4)+1; delay(rcvcnt(4),4)=varargin{3}; end case 'collision' switch varargin{2} case 0 pktcolcnt(1)=pktcolcnt(1)+1; case 1 pktcolcnt(2)=pktcolcnt(2)+1; case 2 pktcolcnt(3)=pktcolcnt(3)+1; case 3 pktcolcnt(4)=pktcolcnt(4)+1; end case 'CRCerror' switch varargin{2} case 0 crcerrcnt(1)=crcerrcnt(1)+1; case 1 crcerrcnt(2)=crcerrcnt(2)+1; case 2 crcerrcnt(3)=crcerrcnt(3)+1; case 3 crcerrcnt(4)=crcerrcnt(4)+1; end case 'accident' % accidentcnt=accidentcnt+1; accidentcnt=[accidentcnt varargin{2}]; case 'save' % FileName=['results/statistic-',datestr(now, 'dd-mmm-yyyy-HH-MM-SS'),'.',varargin{2},'.mat']; FileName=['results/statistic-',datestr(now, 'yyyymmddHHMM'),'-',varargin{2},'.mat']; save(FileName,'delay','pktcolcnt','rcvcnt','sndcnt','accidentcnt','crcerrcnt'); case 'clearmem' clearvars globalDatabase sndcnt rcvcnt pktcolcnt delay accidentcnt crcerrcnt lightSignal %% otherwise if nargin==1 % query when accident happened out=ones(1,2)*1000; index=globalDatabase.keys; tempArray=zeros(1,globalDatabase.Count); inputCarStatus = globalDatabase(varargin{1}); for i=1:globalDatabase.Count currentCarStatus = globalDatabase(index{i}); if currentCarStatus.longitude==inputCarStatus.longitude && currentCarStatus.lane==inputCarStatus.lane tempArray(i)=currentCarStatus.latitude-inputCarStatus.latitude; end end % tempArray if ~isempty(min(tempArray(tempArray>0))) out(1)=abs(min(tempArray(tempArray>0))); end if ~isempty(max(tempArray(tempArray<0))) out(2)=abs(max(tempArray(tempArray<0))); end elseif nargin==2 % query if re-enter the road % carGlobalDB(vehicleID,roadLength) numVehicles=evalin('base','numStations'); index=globalDatabase.keys; tempArray=zeros(1,globalDatabase.Count); tempIndArray=[]; for i=1:globalDatabase.Count tempArray(i)=globalDatabase(index{i}).latitude; end for j=1:globalDatabase.Count if globalDatabase(index{j}).latitude>varargin{2} tempIndArray=[tempIndArray index{j}]; end end % if all cars are registered in the global database, and % if the last car is 20 meters away from the beginning % position, and % If the inqury car is next one to enter the road if isKey(globalDatabase,numVehicles)==1 && min(tempArray(tempArray>0))>20 && varargin{1}==min(tempIndArray) out=double(1); else out=double(0); end elseif nargin==4 % set global database globalDatabase(varargin{1})=carStatus; carObj=globalDatabase(varargin{1}); carObj.carID=varargin{1}; carObj.latitude=varargin{2}; carObj.longitude=varargin{3}; carObj.lane=varargin{4}; end end end